(function () {
  // 描述一个对象的类型
  type myType = {
    name: string;
    age: number;
  };

  /**
   * 接口用来定义一个类结构
   * 用来定义一个类中包含哪些属性和方法
   * 同时接口也可以当类型声明去使用
   * 接口只定义对象的结构，不赋值，接口中的所有方法都是抽象方法
   */
  interface myInterface {
    name: string;
    age: number;
  }

  interface myInterface {
    gender: string;
  }

  const obj: myInterface = {
    name: "xx",
    age: 27,
    gender: "male"
  };

  interface myInter {
    name: string;
    sayHello(): void;
  }

  /**
   * 定义类时，可以用类去实现一个接口
   * 实现接口就是使类满足接口的要求
   */
  class MyClass implements myInter {
    name: string;
    constructor(name: string) {
      this.name = name;
    }

    sayHello(): void {
      console.log("大家好");
    }
  }

  //   const myClass = new MyClass("xxx");
  //   myClass.sayHello();

  // 定义一个表示人的类
  class Person {
    /**
     * TS可以在属性前添加属性的修饰符
     * public 修饰的属性可以在任意位置访问（修改）默认值
     * private 私有属性，只能在类内部进行访问（修改）
     *      - 通过在类中添加方法使得私有属性可以被外部访问到
     * protected 受保护的属性 只能在当前类和当前类的子类中访问（修改）
     */

    private _name: string;
    private _age: number;
    constructor(name: string, age: number) {
      this._name = name;
      this._age = age;
    }

    /**
     * getter方法用来获取属性
     * setter方法用来设置属性
     *  - 称为存储器
     */

    // 定义方法，用来获取name属性
    // getName() {
    //   return this._name;
    // }

    // // 定义方法，用来设置name属性
    // setName(value: string) {
    //   this._name = value;
    // }

    // // 定义方法，获取age属性
    // getAge() {
    //   return this._age;
    // }

    // // 定义方法，设置age属性
    // setAge(value: number) {
    //   if (value < 0) {
    //     console.log("设置的年龄不能是负数");
    //     return;
    //   }
    //   this._age = value;
    // }

    /**
     * TS中设置getter、setter方法的方式
     */
    get name() {
      return this._name;
    }

    set name(value: string) {
      this._name = value;
    }

    get age() {
      return this._age;
    }

    set age(value: number) {
      if (value < 0) {
        console.log("不合法");
        return;
      }
      this._age = value;
    }
  }

  /**
   * 属性可以任意被修改将会导致对象中的数据变的非常不安全
   */
  const per = new Person("孙悟空", 18);
  /* per.setName("猪八戒");
  per.setAge(-3); */

  per.name = "xxx";
  per.age = -3;
  console.log(per);
})();
